home *** CD-ROM | disk | FTP | other *** search
/ Directorty Opus 5 - Magellan 2 / Opus 5 - Magellan 2.iso / Extras / cd_mm_opus5 / arexx / PlayCD_MM.dopus5 next >
Text File  |  1996-04-13  |  29KB  |  732 lines

  1. /* Programm: PlayCD_MM.dopus5 [18-April-1996]
  2. ** $VER: PlayCD_MM.dopus5 1.0 (04-18-96)
  3. ** 
  4. ** Copyright © 1996 Eckhard Ludwig (EMail: Eckhard@top.east.de)
  5. ** PlayCD_MM.dopus5 is freeware.
  6. **
  7. ** Multimedia for Directory Opus 5
  8. ** Play Audio & Video-CD from DOPUS5, Test Play Audio & Video-CD, Save
  9. ** Audio-Tracks to MPEG Layer2, RAW, IFF 8SVX, AIFF, WAVE, VOC, AU & ADPCM2/3.
  10. **
  11. ** Needed: Directory Opus 5.11 (© by Jonathan Potter & GPSoftware)
  12. **         CeeD (Freeware, © 1994-1995 by Peter Urbanec),
  13. **       Video-CD requires Peggy-Plus MPEG-Card, ScalaMMPlayer &
  14. **       MPEG EX-Modul.
  15. **         for save CDDA: AsimCDFS V3.5 (© by Asimware Innovations Inc.)
  16. **         only for save MPEG Layer 2:
  17. **         musicin & MPEGTables (FPU required !)
  18. **         only for save 8SVX & AIFF (Toshiba & Sony CDROM):
  19. **         CDDA 1.12 (Author: mlelstvspecklec.mpifr-bonn.mpg.de)
  20. **         only for save ADPCM2/3:
  21. **       X2ADPCM (Author: flowerpeikon.e-technik.tu-muenchen.de)
  22. **         & AIFF-Datatype 
  23. **       save WAV, AIFF, VOC, AU needed Amisox 3.3
  24. **
  25. **
  26. ** Create new button (CD Multimedia), Call as:
  27. ** ----------------------------------------------------------------------
  28. ** ARexx    DOpus5:ARexx/PlayCD_MM.dopus5 {Qp} [GUI]
  29. ** ----------------------------------------------------------------------
  30. ** Set Attribut: "Output to window" (Ausgabe in Fenster).
  31. ** Option GUI for open CeeD-GUI (Edit the CD-cataloge)
  32. */
  33.  
  34. /*--------S E T T I N G S : --------------------------------------------*/
  35. /* If the file ENV:PlayCD_MM.prefs exists, that one will override the   */
  36. /* settings here ...                                                    */
  37.  
  38. /* Path to CEED */
  39. CDPlay = "DOpus5:CEED/CEED"
  40. KATALOG="DOpus5:CeeD/Disks"
  41. Device="2nd.scsi.device"
  42. Unit=2
  43. BLOCKDIFF=150  /* Differenz Blocks, CeeD-Fehler? */
  44.  
  45. /* Path to ScalaMMPlayer (Install MPEG EX-Modul !) */
  46. MPEGPlayer="Work:Scala/ScalaMMPlayer"
  47. VMON ="NO"  /* YES= 2.Videomonitor (Grafikkarte), NO= 1 Monitor */
  48. VTIME=10      /* Zeit in sec bis zum Anlaufen des Video ( zu kurz = GURU !) */
  49.  
  50. /* Path to MPEG Audio-Encoding */
  51. MPEGENC= "DOpus5:MpegAudio/musicin.030FPU -b 192 -d c -m j"
  52. MPEGTAB= "DOpus5:MpegAudio/Tables"
  53.  
  54. /* Path to CDDA 1.12 */
  55. CDSave = "C:CDDA" /* only for Toshiba/Sony CDROM */
  56.  
  57. /* Path to ADPCM-Encoding  */
  58. ADPCM = "C:X2ADPCM"
  59.  
  60. CDROMPL="TOSHIBA"
  61. Amisox = "C:SOX020"
  62. ASIMCD = "CD0:"
  63. RESTTIME=2    /* Auslaufzeit in sec Video/Audio-CD (Pause zwischen 2 Tracks) */
  64.  
  65. /*--Hauptprogramm--------------------------------------------------------*/
  66.  
  67. if ~show('l','rexxsupport.library') then call addlib('rexxsupport.library',0,-30,0)
  68. if ~openport('ceed-handler') then exit
  69.  
  70. signal on syntax
  71. signal on halt
  72. options results
  73. options failat 21
  74. lf='0a'x
  75.  
  76. if open(1,'env:PlayCD_MM.prefs','R') then do /* Environment-Variable auswerten */
  77.    do i=1 to 15
  78.     prefs.i = readln(1)
  79.         end
  80.    if prefs.2 ~="" then CDPlay=prefs.2
  81.    if prefs.3 ~="" then CDSave=prefs.3
  82.    if prefs.4 ~="" then RESTTIME=prefs.4
  83.    if prefs.5 ~="" then Device=prefs.5
  84.    if prefs.6 ~="" then Unit=prefs.6
  85.    if prefs.7 ~="" then KATALOG=prefs.7
  86.    if prefs.8 ~="" then Amisox=prefs.8
  87.    if prefs.9 ~="" then MPEGENC=prefs.9
  88.    if prefs.10 ~="" then MPEGTAB=prefs.10
  89.    if prefs.11 ~="" then ADPCM=prefs.11
  90.    if prefs.12 ~="" then ASIMCD=prefs.12
  91.    if prefs.13 ~="" then CDROMPL=prefs.13
  92.    if prefs.14 ~="" then MPEGPlayer=prefs.14
  93.    if prefs.15 ~="" then VMON=prefs.15
  94.  
  95.    drop prefs.
  96.    call close(1)
  97.    end
  98.  
  99. /* init locale standard=deutsch */
  100. if ~show(l,'locale.library') then call addlib('locale.library',0,-30)
  101. if show(l,'locale.library') then catalog=opencatalog('PlayCD_MM.catalog','deutsch',0)
  102.  
  103. parse arg portname GUI
  104. if portname='' then portname='DOPUS.1'
  105. address value portname
  106.  
  107. if ~show('P','CEED') then do  /* CeeD wird gestartet */
  108.    if ~exists(CDPlay) then do
  109.       dopus front
  110.       dopus request '"'getcatstr(0,'Fehler:'lf'CeeD nicht gefunden (Pfad: %s ).'lf'Setze Pfad oder starte CeeD zuerst !',CDPlay)'"' getcatstr(1,'Beenden')
  111.       call closeport('ceed-handler')
  112.       Exit
  113.       end
  114.    if ~exists(KATALOG) then do
  115.       dopus front
  116.       dopus request '"'getcatstr(2,'Fehler:'lf'Verzeichnis für CD-Kataloge nicht gefunden (Pfad: %s ).'lf'Setze Pfad oder starte CeeD zuerst !',KATALOG)'"' getcatstr(1,'Beenden')
  117.       call closeport('ceed-handler')
  118.       Exit
  119.       end
  120.    call pragma("STACK",20000)
  121.    address command
  122.    if GUI="GUI" then "Run >NIL: "CDPlay" DEVICE="DEVICE" UNIT="UNIT" CATALOG="KATALOG
  123.       else "Run >NIL: "CDPlay" DEVICE="DEVICE" UNIT="UNIT" CATALOG="KATALOG" NOGUI"
  124.    'waitforport CEED'
  125.    CEEDST=1
  126. end
  127.     
  128. address value portname
  129. lister new  /* Opus-Lister wird geöffnet */
  130. handle=result
  131.  
  132. do forever   /* Schleife bei CD-Wechsel */
  133.    CDDA=0
  134.    VIDEO=0
  135.    VFLAG=0
  136.    CDROM=0
  137.    address 'CEED'
  138.    'GET_NUM_TRACKS' /* CD eingelegt ? */
  139.    if result=0 then call Meldung1 /* Keine CD eingelegt */
  140.    'GET_NUM_TRACKS' /* letzten Track ermitteln */
  141.    MAXTRACK=result
  142.    'STOP'
  143.    'GET_DISC_NAME'
  144.    cdlabel=result
  145.    'GET_ARTIST_NAME'
  146.    CDARTIST=result
  147.    'GET_TRACK_TIME' 1  /* Einlauftrack */
  148.    TIME=result
  149.    if pos("Video",CDLABEL)>0 then VIDEO=1
  150.    if cdlabel='result' then call Ende /* CeeD wurde beendet */
  151.    if cdlabel="<Unknown CD>" then do
  152.     cdname=getcatstr(3,'Kein Katalogeintrag !')
  153.        address value portname
  154.       dopus request '"'getcatstr(20,'Für die CD existiert'lf'kein Eintrag im Medienkatalog.'lf'Bitte wählen Sie den Typ aus.')'"' getcatstr(27,'Audio-CD|Video-CD|CDROM')
  155.       if RC=1 then CDDA=1
  156.       if RC=2 then VIDEO=1
  157.       if RC=0 then CDROM=1
  158.          if CDDA=1 then cdname=getcatstr(31,'Audio CD (CDDA)')
  159.          if VIDEO=1 then cdname='Video CD'
  160.          if CDROM=1 then cdname='CDROM'
  161.     end
  162.       else CDNAME=CDARTIST"-"cdlabel
  163.    address value portname
  164.    lister set handle title CDNAME
  165.    lister set handle sort name /* Lister nach Namen (da Nummern vorangestellt werden) sortieren */
  166.    lister set handle busy on
  167.    lister set handle progress MAXTRACK getcatstr(4,'Erstelle Titelliste ...')
  168.    lister refresh handle full  
  169.    do i=1 to MAXTRACK
  170.       lister query handle abort              /* Abbruch ? */
  171.       if result then leave
  172.       lister set handle progress count i
  173.       lister set handle progress name getcatstr(5,'Titel')'  'i
  174.       address 'CEED'
  175.       'GET_NUM_TRACKS'
  176.       if result=0 then leave              /* falls während einlesen CD von Hand ausgeworfen wird */
  177.       'GET_TRACK_NAME' i
  178.       SONGNAME=result
  179.       BLOCKSIZE=2048
  180.       if left(SONGNAME,5)="Daten" | left(SONGNAME,4)="Data" | SONGNAME="CD-ROM" | right(SONGNAME,4)="Data" | CDROM=1 then SONGNAME=getcatstr(6,'Daten Track')
  181.       if VIDEO=1 & SONGNAME~=getcatstr(6,'Daten Track') then BLOCKSIZE=2328
  182.       if VIDEO~=1 & SONGNAME~=getcatstr(6,'Daten Track') then do
  183.         CDDA=1    /* wenigsten ein Audio-Track sollte drauf sein */
  184.          BLOCKSIZE=2352
  185.         end
  186.       'GET_TRACK_TIME' i+1
  187.       TIME2=result
  188.       BLOCKS1=left(TIME,2)*4500+substr(TIME,4,2)*75+right(TIME,2)-BLOCKDIFF
  189.       BLOCKS2=left(TIME2,2)*4500+substr(TIME2,4,2)*75+right(TIME2,2)-BLOCKDIFF
  190.       TIME=TIME2
  191.       BLOCKS=BLOCKS2-BLOCKS1
  192.       SONGTIME=right(BLOCKS%4500,2,0)
  193.       SONGTIME=SONGTIME":"right((BLOCKS-(SONGTIME*4500))%75,2,0)
  194.       j=right(i,2)
  195.     address value portname   
  196.       lister add handle '"'j" "SONGNAME'" 'BLOCKS*BLOCKSIZE' -1 'i' r 'SONGTIME"   ("BLOCKS1"-"BLOCKS2-1")"
  197.       lister set handle display name size comment
  198.       lister refresh handle full
  199.    end
  200.    address 'CEED'
  201.    'GET_NUM_TRACKS'
  202.    if result=0 then do        /* wurde CD ausgeworfen ? */
  203.     address value portname
  204.     lister set handle busy off
  205.     lister clear handle
  206.     lister refresh handle full
  207.     iterate     /* dann an Schleifen-Anfang, wo dies gemeldet wird */
  208.     end
  209.    'GET_TRACK_TIME' MAXTRACK+1
  210.    CDTIME=result    /* CD-Länge merken für Vergleiche */
  211.    address value portname
  212.    lister set handle busy off
  213.  
  214.    if CDDA~=1 & VIDEO~=1 then do  /* CD nur Datentracks ?*/
  215.     lister set handle busy on
  216.     dopus request '"'getcatstr(21,'Fehler:'lf'CD enthält nur Datentracks !')'"' getcatstr(26,'Beenden|Ok')
  217.     if RC=1 then do
  218.            lister set handle busy off
  219.            call Ende
  220.            end
  221.     lister set handle busy off
  222.     lister clear handle
  223.     lister refresh handle full
  224.     iterate
  225.     end
  226.    if VIDEO=1 & ~show('P','rexx_ScalaMM') then do
  227.      if show('P','Peggy') then do
  228.           dopus front
  229.           dopus request '"'getcatstr(30,'Fehler:'lf'Bitte zuerst den Peggyplus/MPEGPlayer beenden !')'"' getcatstr(1,'Ende')
  230.       call Ende
  231.       end
  232.       if exists(MPEGPlayer) then do
  233.     call pragma('STACK',30000)
  234.         address command 'RUN >NIL: <NIL: 'MPEGPlayer' -arexx'
  235.         address command 'waitforport rexx_ScalaMM'
  236.         end
  237.       else do
  238.           dopus front
  239.           dopus request '"'getcatstr(28,'Leider ist ein Fehler aufgetreten:'lf'Das Spielen von Video-CD erfordert eine Peggy MPEG-Karte und den ScalaMMPlayer !'lf'Der aktuelle Player-Pfad ist: '"'%s'"'',MPEGPlayer)'"' getcatstr(1,'Beenden')
  240.       call Ende
  241.           end
  242.    end
  243.  
  244.    lister set handle handler 'ceed-handler' 'quotes'
  245.  
  246.    /* install traps */
  247.    address value portname
  248.    dopus addtrap copy 'ceed-handler'
  249.    dopus addtrap move 'ceed-handler'
  250.    dopus addtrap copyas 'ceed-handler'
  251.    dopus addtrap moveas 'ceed-handler'
  252.    dopus addtrap read 'ceed-handler'
  253.    dopus addtrap hexread 'ceed-handler'
  254.    dopus addtrap delete 'ceed-handler'
  255.    dopus addtrap rename 'ceed-handler'
  256.    dopus addtrap devicelist 'ceed-handler'
  257.    dopus addtrap parent 'ceed-handler'
  258.    dopus addtrap root 'ceed-handler'
  259.    dopus addtrap show 'ceed-handler'
  260.    dopus addtrap play 'ceed-handler'
  261.    dopus addtrap protect 'ceed-handler'
  262.    dopus addtrap datestamp 'ceed-handler'
  263.    dopus addtrap comment 'ceed-handler'
  264.    dopus addtrap makedir 'ceed-handler'
  265.    dopus addtrap addicon 'ceed-handler'
  266.    dopus addtrap cachelist 'ceed-handler'
  267.  
  268. /*---Beginn des ceed-handler--------------------------------------*/
  269.    do forever
  270.      if waitpkt('ceed-handler') then do
  271.        packet=getpkt('ceed-handler')
  272.        if packet='00000000'x then iterate
  273.        event=getarg(packet,0)
  274.        handle=getarg(packet,1)
  275.        titel=getarg(packet,2)
  276.        user=getarg(packet,3)
  277.        pathstr=getarg(packet,4)
  278.        if event="Root" then leave
  279.        if event="Parent" then leave
  280.        if event="parent" then leave
  281.        if event="inactive" then call Ende
  282.        address 'CEED'
  283.        'GET_NUM_TRACKS'
  284.        if result=0 then leave       /* CD wurde vor Play entnommen ! */
  285.        'GET_TRACK_TIME' MAXTRACK+1
  286.        if result~=CDTIME then leave  /* CD wurde vertauscht ! */
  287.        T_FLAG=0
  288.         select
  289.           when event="doubleclick" then call Player
  290.           when event="Play" then call SelPlay
  291.           when event="path" then iterate
  292.           when event="Show" then call CDTest
  293.           when event="Copy" then call SaveCD
  294.           when event="Move" then call SaveCD
  295.           when event="CopyAs" then call SaveCDAs
  296.           when event="MoveAs" then call SaveCDAs
  297.           when event="MakeDir" then call CDEject
  298.            when event="AddIcon" then call CDEject
  299.           when event="CacheList" then call CDEject
  300.           when event="dropfrom" then call SaveCD
  301.           when event="drop" then iterate
  302.           otherwise call Productinfo
  303.         end
  304.        address value portname
  305.        reply(packet,10)
  306.      end
  307.      address 'CEED'
  308.      'GET_NUM_TRACKS'
  309.      if result=0 then leave       /* CD wurde während Play entnommen ! */
  310.    end
  311.    address value portname
  312.    lister clear handle
  313.    lister refresh handle full
  314. end      /* Ende Schleife bei CD-Wechsel */
  315.  
  316. /*---Unterprogramm CD auswerfen------------------------------------------------------------------*/
  317. CDEject:
  318. address 'CEED'
  319. 'EJECT'
  320. return
  321.  
  322. /*---Unterprogramm Tracks anspielen---------------------------------------------------------------*/
  323. CDTest:
  324. address value portname
  325. dopus request '"'getcatstr(8,'Audio/Video-CD anspielen:'lf''lf'Den Track anspielen für wie lang ?')'"' getcatstr(9,'30s|45s|60s|Abbruch')
  326. if RC=0 then return
  327. if RC=1 then sptime=30
  328. if RC=2 then sptime=45
  329. if RC=3 then sptime=60
  330. T_FLAG=1
  331.  
  332. /*---Unterprogramm selektierte Tracks spielen-----------------------------------------------------*/
  333. SelPlay:
  334. if VIDEO=1 then VFLAG=1
  335. address value portname
  336. lister set handle busy on
  337. lister query handle selfiles stem files.
  338.  
  339. address 'CEED'
  340. 'STOP'
  341. do i=0 to files.count-1
  342.    titel=files.i
  343.    call Player
  344.    address 'CEED'
  345.    'GET_TRACK_TIME' left(titel,2)
  346.    TIME=result
  347.    'GET_TRACK_TIME' left(titel,2)+1
  348.    TIME2=result
  349.    BLOCKS=(left(TIME2,2)*4500+substr(TIME2,4,2)*75+right(TIME2,2))-(left(TIME,2)*4500+substr(TIME,4,2)*75+right(TIME,2))
  350.    SEC=(BLOCKS%75)-RESTTIME
  351.    If T_FLAG=1 then SEC=sptime
  352.    TIME=(left(TIME,2)*60)+substr(TIME,4,2)
  353.    address value portname
  354.    if T_FLAG=0 then do
  355.           if VIDEO=1 then lister set handle progress SEC getcatstr(29,'Spiele Video-CD ...  Track')' 'i+1'/'files.count
  356.              else lister set handle progress SEC getcatstr(7,'Spiele Audio-CD ...  Titel')' 'i+1'/'files.count
  357.     end
  358.      else lister set handle progress SEC getcatstr(10,'Spiele Track %s sec an ...  Track',sptime)' 'i+1'/'files.count
  359.    lister refresh handle full  
  360.    do k.eins= 1 to SEC          /* Zeitschleife Tracklaufzeit */
  361.       address 'CEED'
  362.       'GET_NUM_TRACKS'
  363.       if result=0 then leave         /* CD wurde entnommen */
  364.       TIME=TIME+1
  365.       if getcatstr(6,'Daten Track')~=substr(titel,4) & VIDEO=1 then do
  366.              'GET_CUR_TIME'
  367.        TIME2=(left(result,2)*60)+substr(result,4,2)
  368.              if TIME2<TIME then do       /* Pause 1sec Video-CD über Scala (sonst kein MT ?) */
  369.         address 'rexx_ScalaMM'
  370.         'PAUSE 1'
  371.         'SHOW'
  372.         end
  373.     end
  374.       do k.zwei=1 to 12            /* Sekunden Feintuning mittels selbstdichtender Schaftbolzen */
  375.            address 'CEED'
  376.              'GET_CUR_TIME'
  377.        TIME2=(left(result,2)*60)+substr(result,4,2)
  378.              if TIME2>=TIME then leave k.zwei
  379.              'GET_CUR_TRACK'
  380.              if result~=left(titel,2) then leave k.eins /* Trackvergleich (2.Sicherheit) */
  381.              delay(10)
  382.              end
  383.       TIME2=(SEC-k.eins)%60
  384.       TIME2=right(TIME2,2,0)":"right((SEC-k.eins)-(TIME2*60),2,0)   
  385.       address value portname
  386.       lister set handle progress count k.eins
  387.       lister set handle progress name TIME2' 'substr(files.i,4,21)
  388.       lister query handle abort
  389.       if result then do
  390.         lister set handle busy off
  391.         lister clear handle progress
  392.         lister refresh handle full
  393.         if getcatstr(6,'Daten Track')~=substr(titel,4) & VIDEO=1 then do
  394.         address 'rexx_ScalaMM'
  395.         EX MPEG PLAY STOP
  396.         'SHOW'
  397.         'CONTINUE'
  398.         return
  399.         end
  400.         address 'CEED'
  401.         'STOP'
  402.         return
  403.         end
  404.    end
  405.    address value portname
  406.    lister select handle '"'files.i'"' off
  407.    lister clear handle progress
  408.    lister refresh handle full
  409. end
  410. lister set handle busy off
  411. if getcatstr(6,'Daten Track')~=substr(titel,4) & VIDEO=1 then do
  412.     address 'rexx_ScalaMM'
  413.     EX MPEG PLAY STOP
  414.     'SHOW'
  415.     'CONTINUE'
  416.     end
  417. address 'CEED'
  418. 'STOP'
  419. return
  420.  
  421. /*---Unterprogramm Play -------------------------------------------------------------------------*/
  422. Player:
  423. if getcatstr(6,'Daten Track') = substr(titel,4) then return  /* Datentrack return */
  424. if CDDA=1 then do
  425.     address 'CEED'
  426.     'PLAY' left(titel,2)
  427.     return
  428.     end
  429. if VIDEO~=1 then return
  430.  
  431. /*---Unterprogramm Play Video -------------------------------------------------------------------*/
  432.  
  433. address 'rexx_ScalaMM'
  434. 'MOUSE on'
  435. 'FKEYS off'
  436. 'NUMKEYS off'
  437. 'JOYSTICK off'
  438. 'POINTER off'
  439. 'INTERACTIVE off'
  440.  
  441. EX MPEG PLAY CD left(titel,2)" "left(titel,2)
  442.  
  443. if VMON="NO" | VFLAG=0 then do  /* Titel nur bei 1Monitor oder Doppelklick */
  444.     'BLANK 736 566 4 lace hires 0'
  445.     'PALETTE 000 fff ccc aaa 888 666 262626 000 c00 d60 fb0 080 58b 53c a2b f3b'
  446.     'WIPE cut speed 1'
  447.     'MARGINS on 58 677'
  448.     'FONT helvetica.font 39'
  449.     'COLOR 1 3 7 7 7 0 1 7 0 1 2 4 7 5 1'
  450.     'ATTRIBUTES shadow edge remap left'
  451.     'STYLE 0 3 3 3 6 2 1 33 5 1 13 5 2 0 1 0 4 4 7'
  452.     'TEXTWIPE wipe east speed 10'
  453.     'TEXT 58 74 'translate(CDARTIST," "," ")  /* Space durch Altspace (ASCII 160) ersetzen */
  454.     'COLOR 2 4 7 7 7 0 2 7 0 2 1 1 5 3 2'
  455.     'TEXTWIPE wipe west speed 10'
  456.     'TEXT 58 129 'translate(CDLABEL," "," ")  /* Space durch Altspace (ASCII 160) ersetzen */
  457.     'COLOR 10 0 9 7 7 0 10 0 0 10 10 10 7 6 10'
  458.     'ATTRIBUTES edge jam antialias remap center'
  459.     'STYLE 0 3 2 3 6 2 1 33 5 1 13 5 6 2 1 1 4 4 7'
  460.     'TEXTWIPE bob east easeout speed 10'
  461.     'TEXT 250 460 'translate(center(substr(titel,4),30)," "," ")' pause 5'
  462.     'TEXTWIPE dissolve speed 6'
  463.     'TEXTOUT 1 pause 2'
  464.     'TEXTOUT 2'
  465.     'TEXTOUT 3 pause 10'
  466.     'SHOW'
  467.     if VFLAG=1 then return
  468.     'PAUSE -1'
  469.     'SHOW'
  470.     'CONTINUE'
  471.     return
  472.     end
  473. 'SHOW'
  474.  
  475. address value portname
  476. if i=0 then dopus front
  477.  
  478. address 'rexx_ScalaMM'
  479. 'PAUSE 'VTIME
  480. 'SHOW'
  481. return
  482.  
  483. /*---Unterprogramm Audio-Tracks speichern---------------------------------------------------------------*/
  484. SaveCDAs:
  485. T_FLAG=1
  486. SaveCD:
  487. if VIDEO=1 then return
  488. address value portname
  489. select
  490.     when (CDROMPL="TOSHIBA" | CDROMPL="SONY") & showlist("D","asimcdfs.device")=1 then dopus request '"'getcatstr(11,'Speichern von Audiodaten:'lf'Bitte das Speicherformat wählen.')'"' 'MP2|MP32|AIFF|8SVX|MONO|RAW|WAVE|VOC|AU|ADPCM2|ADPCM3|'getcatstr(12,'Abbruch')
  491.     when showlist("D","asimcdfs.device")=1 then dopus request '"'getcatstr(11,'Speichern von Audiodaten:'lf'Bitte das Speicherformat wählen.')'"' 'MP2|MP32|AIFF|RAW|WAVE|VOC|AU|ADPCM2|ADPCM3|'getcatstr(12,'Abbruch')
  492.     when CDROMPL="TOSHIBA" | CDROMPL="SONY" then dopus request '"'getcatstr(11,'Speichern von Audiodaten:'lf'Bitte das Speicherformat wählen.')'"' 'MP2|AIFF|8SVX|MONO|ADPCM2|ADPCM3|'getcatstr(12,'Abbruch')
  493.     otherwise do
  494.     dopus request '"'getcatstr(17,'Fehler:'lf'CDDA V1.12 unterstützt nur SONY & TOSHIBA CDROM-Laufwerke.'lf'Für Save über andere CDDA-fähige Laufwerke bitte AsimCDFS (ab V3.5) installieren.')'"' getcatstr(16,'Zurück')
  495.     return
  496.     end
  497. end
  498. SP_FLAG=RC
  499. if SP_FLAG=0 then return
  500.  
  501. If (CDROMPL="TOSHIBA" | CDROMPL="SONY") & showlist("D","asimcdfs.device")=1 then FT=word(".mp2 .mp32 .aiff .8svx .mono .cdr .wave .voc .au .adpcm2 .adpcm3",SP_FLAG)
  502. else do
  503.   If showlist("D","asimcdfs.device")=1 then FT=word(".mp2 .mp32 .aiff .cdr .wave .voc .au .adpcm2 .adpcm3",SP_FLAG)
  504.     else FT=word(".mp2 .aiff .8svx .mono .adpcm2 .adpcm3",SP_FLAG)
  505.   end
  506. if FT=".adpcm2" | FT=".adpcm3" then do
  507.     if ~exists(ADPCM) then do
  508.        dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Das externe Programm X2ADPCM (aktueller Pfad %s ) wurde nicht gefunden.',ADPCM)'"' getcatstr(16,'Zurück')
  509.        return
  510.            end
  511.     if ~exists("DEVS:Datatypes/AIFF") | ~exists("SYS:Classes/Datatypes/aiff.datatype") then do
  512.        dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Der AIFF Datatype (aktueller Pfad %s ) ist nicht installiert.',"SYS:Classes/Datatypes/aiff.datatype")'"' getcatstr(16,'Zurück')
  513.        return
  514.            end
  515.         end
  516. if (FT=".mono" | FT=".8svx") | ((FT=".aiff" | FT=".mp2" | FT=".adpcm2" | FT=".adpcm3") & showlist("D","asimcdfs.device")~=1 & (CDROMPL="TOSHIBA" | CDROMPL="SONY")) then do
  517.     if ~exists(CDSave) then do
  518.        dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Das externe Programm CDDA V1.12 (aktueller Pfad %s ) wurde nicht gefunden.',CDSave)'"' getcatstr(16,'Zurück')
  519.        return
  520.            end
  521.     call open('file','ENV:CDDA_DEVICE',W)
  522.     call writech('file',DEVICE)
  523.     call close ('file')
  524.     call open('file','ENV:CDDA_UNIT',W)
  525.     call writech('file',UNIT)
  526.     call close ('file')
  527.        end
  528.    else do
  529.    if showlist("D","asimcdfs.device")=1 then do
  530.        if ~exists(ASIMCD"AIFF_Stereo") then do
  531.        dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Der Devicename des CDROM (aktuell %s ) ist nicht korrekt installiert,'lf'bzw. wählen Sie über AsimCDFS/DiscChanger CD-Audio aus.',ASIMCD)'"' getcatstr(16,'Zurück')
  532.        return
  533.            end
  534.   end
  535. end
  536. if ~exists(Amisox) then do
  537.        if FT=".mp32" | FT=".wave" | FT=".voc" | FT=".au" | ((FT=".adpcm2" | FT=".adpcm3" | FT=".mp2") & CDROMPL~="TOSHIBA" & CDROMPL~="SONY" & showlist("D","asimcdfs.device")~=1) then do
  538.        dopus request '"'getcatstr(15,'Leider ist ein Fehler aufgetreten:'lf'Das externe Programm AmiSOX (aktueller Pfad %s ) wurde nicht gefunden.'lf'Wählen Sie Speichern als RAW, AIFF, MP2 oder ADPCM.',Amisox)'"' getcatstr(16,'Zurück')
  539.        return
  540.            end
  541.     end
  542.  
  543. address 'CEED'
  544. 'STOP'
  545. address value portname
  546. lister set handle busy on
  547. lister set user busy on
  548. if event='dropfrom' then do
  549.    files.count=1
  550.    LNG=POS('22'x,titel,2)-1
  551.    titel=left(titel,LNG)
  552.    files.0=right(titel,LNG-1)
  553.    end
  554.    else lister query handle selfiles stem files.
  555. lister set handle progress files.count getcatstr(18,'Speichere Audiodaten ...')
  556. lister refresh handle full  
  557. lister query user path
  558. Zielpfad=result
  559.  
  560. do i=0 to files.count-1
  561.    titel=strip(left(substr(files.i,4),21))
  562.    tracknr=strip(left(files.i,2),"B"," ")
  563.    tracknr2=right(tracknr,2,0)
  564.    address 'CEED'
  565.    'GET_TRACK_NAME' tracknr
  566.    SONGNAME=result
  567.    'GET_TRACK_TIME' tracknr
  568.    TIME=result
  569.    'GET_TRACK_TIME' tracknr+1
  570.    TIME2=result
  571.    BLOCKS1=left(TIME,2)*4500+substr(TIME,4,2)*75+right(TIME,2)-BLOCKDIFF
  572.    BLOCKS2=left(TIME2,2)*4500+substr(TIME2,4,2)*75+right(TIME2,2)-BLOCKDIFF
  573.    BLOCKS=BLOCKS2-BLOCKS1
  574.    SONGTIME=right(BLOCKS%4500,2,0)
  575.    SONGTIME=SONGTIME":"right((BLOCKS-(SONGTIME*4500))%75,2,0)
  576.    address value portname
  577.    lister set handle progress count i+1
  578.    lister set handle progress name titel||FT
  579.    lister query handle abort
  580.    if result then leave
  581.    if getcatstr(6,'Daten Track') ~= substr(files.i,4) then do  /* Datentrack überspringen */
  582.      if T_FLAG=1 then do
  583.        command beep
  584.        dopus getstring '"'getcatstr(13,'Bitte neuen Namen eingeben')'"' 21 '"'titel'"' 'OK|'getcatstr(12,'Abbruch') 
  585.        if DOPUSRC=0 then leave
  586.        ttitel=result
  587.        if ttitel~="RESULT" then titel=ttitel
  588.           lister set handle progress name titel||FT
  589.        end 
  590.           if FT=".8svx" then address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||tracknr2" "titel||FT'"'||" MUTE 8SVX"
  591.           if FT=".mono" then address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||tracknr2" "titel||FT'"'||" MUTE 8SVX MONO"
  592.     If showlist("D","asimcdfs.device")=1 then do
  593.        if FT=".aiff" then address command "copy "ASIMCD"AIFF_Stereo/Track."tracknr" to "'"'||Zielpfad||tracknr2" "titel||FT'"'||" QUIET"
  594.        if FT=".cdr"  then address command "copy "ASIMCD"CDDA_LeastSignificant/Track."tracknr" to "'"'||Zielpfad||tracknr2" "titel||FT'"'||" QUIET"
  595.            if FT=".wave" then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -twav "'"'||Zielpfad||tracknr2" "titel||FT'"'
  596.            if FT=".mp32" then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -taiff -r32000 "'"'||Zielpfad||titel'"'
  597.            if FT=".voc"  then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -tvoc "'"'||Zielpfad||tracknr2" "titel||FT'"'
  598.            if FT=".au"   then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -U -r8000 "'"'||Zielpfad||tracknr2" "titel||FT'"'
  599.            if FT=".adpcm2" then address command ADPCM" "'"'||ASIMCD"AIFF_Stereo/Track."||tracknr'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=2"
  600.            if FT=".adpcm3" then address command ADPCM" "'"'||ASIMCD"AIFF_Stereo/Track."||tracknr'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=3"
  601.        if FT=".mp2"|FT=".mp32" then do
  602.         OldStack=pragma("STACK",80000)
  603.         OldPrior=pragma("PRIORITY",-2)
  604.         address command
  605.         "setenv MPEGTABLES "||MPEGTAB
  606.         if FT=".mp2" then MPEGENC" "ASIMCD"AIFF_Stereo/Track."tracknr" "'"'||Zielpfad||tracknr2" "titel||FT'"'        
  607.               else MPEGENC" -s 32 "'"'||Zielpfad||titel'"'" "'"'||Zielpfad||tracknr2" "titel||FT'"'    
  608.         call pragma("STACK",OldStack)
  609.         call pragma("PRIORITY",OldPrior)
  610.         end
  611.        if FT=".mp32" then address command "Delete >NIL: "'"'||Zielpfad||titel'"'
  612.        end
  613.     else do
  614.     if FT=".aiff" then address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||tracknr2" "titel||FT'"'||" MUTE"
  615.         if FT=".adpcm3" | FT=".adpcm2" | FT=".mp2" then do
  616.        address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||titel'"'||" MUTE"
  617.            if FT=".adpcm2" then address command ADPCM" "'"'||Zielpfad||titel'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=2"
  618.            if FT=".adpcm3" then address command ADPCM" "'"'||Zielpfad||titel'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=3"
  619.        if FT=".mp2" then do
  620.         OldStack=pragma("STACK",80000)
  621.         OldPrior=pragma("PRIORITY",-2)
  622.         address command
  623.         "setenv MPEGTABLES "||MPEGTAB
  624.         MPEGENC" "'"'||Zielpfad||titel'"'" "'"'||Zielpfad||tracknr2" "titel||FT'"'    
  625.         call pragma("STACK",OldStack)
  626.         call pragma("PRIORITY",OldPrior)
  627.             end    
  628.        address command "Delete >NIL: "'"'||Zielpfad||titel'"'
  629.        end
  630.     end
  631.       address command "FILENOTE "'"'Zielpfad||tracknr2" "titel||FT'"'" "'"'SONGTIME" "left(cdname,32,'20'x)" "SONGNAME'"'
  632.       end
  633.    address value portname
  634.    lister select handle '"'files.i'"' off
  635.    lister refresh handle full
  636. end
  637.  
  638. lister set handle busy off
  639. lister set user busy off
  640. lister read user Zielpfad force
  641. lister refresh user full
  642. return
  643.  
  644. /*---Unterprogramm Copyright---------------------------------------------------------------------*/
  645. Productinfo:
  646. address 'CEED'
  647. 'VERSION FULL'
  648. pversion=result
  649. address value portname
  650. do forever
  651.   dopus request '"'getcatstr(19,'Über')' PlayCD_MM.dopus5 V1.0:'lf'Copyright ©1996 Eckhard Ludwig'lf'Freely distributable release'lf''lf'CDDA-Player='CDPlay''lf''PVersion||lf||lf||'CD Artist='CDARTIST||lf||getcatstr(24,'CD Katalogtitel=%s'lf'CD Gesamtdauer=%s (min:sec:frames)',cdlabel,CDTIME)'"' getcatstr(23,'Beenden|Über CDROM|Über MP2|Hilfe|Ok')
  652.   if RC=0 then return
  653.   if RC=1 then call Ende
  654.   if RC=2 then dopus request '"'"Configuration (PlayCD_MM.prefs):"||lf||lf||"CDROM="CDROMPL||lf||"Device="Device"  Unit="Unit||lf"Catalog="KATALOG||lf"Videoplayer="MPEGPlayer'"' getcatstr(16,'Zurück')
  655.   if RC=4 then dopus request '"'getcatstr(22,'PlayCDDA_CeeD.dopus5 Kurzhilfe:'lf'Mutterverzeichnis: CD neu einlesen'lf'Doppelklick: Spielen ab geklickten Titel'lf'Abspielen: Spiele alle selektierten Titel'lf'Anzeigen: Spiele alle selektierten Titel kurz an'lf'Kopieren: Selektierte Titel speichern'lf'Schublade: CD auswerfen')'"' getcatstr(16,'Zurück')
  656.   if RC=3 then do
  657.     POS1=pos("-m",MPEGENC)
  658.     if POS1>0 then CM=substr(MPEGENC,POS1+3,1)
  659.     POS1=pos("-d",MPEGENC)
  660.     if POS1>0 then DE=substr(MPEGENC,POS1+3,1)
  661.     POS1=pos("-b",MPEGENC)
  662.     if POS1>0 then BitR=substr(MPEGENC,POS1+3,3)
  663.     else BitR="382"
  664.    select
  665.     when CM="d" then CMode="Dual channel"
  666.     when CM="j" then CMode="Joint stereo"
  667.     when CM="m" then CMode="Single channel"
  668.     otherwise CMode="Stereo"
  669.        end
  670.    select
  671.     when DE="5" then DEE="50/15 microsec"
  672.     when DE="c" then DEE="CCITT j.17"
  673.     otherwise DEE="None"
  674.        end
  675.    dopus request '"'"MPEG Encoder Configuration:"lf"Layer = 2"lf"Channel Mode = "CMode||lf"Total bitrate = "BitR" kbps"lf"De-emphasis = "DEE'"' getcatstr(16,'Zurück')
  676.    end
  677. end
  678. /*---Unterprogramm Lokalisierung (Dank an Edmund Vermeulen)--------------------------------------*/
  679. getcatstr:
  680.    parse arg msgno,msgstring,insert.1,insert.2
  681.    if catalog~=0 then msgstring=getcatalogstr(catalog,msgno,msgstring)
  682.    j=0
  683.    do while pos('%s',msgstring)>0
  684.       parse var msgstring fore '%s' aft
  685.       j=j+1
  686.       msgstring=fore||insert.j||aft
  687.       end
  688.    return msgstring
  689. /*---Unterprogramm Audio-CD einlegen-------------------------------------------------------------*/
  690. Meldung1:
  691.   address value portname
  692.   dopus request '"'getcatstr(25,'Fehler:'lf'Bitte eine Video oder Audio-CD einlegen...'lf'(Ok wartet 90 Sekunden)')'"' getcatstr(26,'Beenden|Ok')
  693.   if RC=1 then call Ende
  694.   do i= 1 to 90  /* wait max 90sec */
  695.      address value portname
  696.      lister query handle busy /* wurde inzwischen Lister geschlossen ?*/
  697.      if RC>0 then leave
  698.      address 'CEED'     
  699.      'GET_NUM_TRACKS'
  700.      if result>0 then return
  701.      delay(50)
  702.   end
  703. /*---Unterprogramm Programm beenden--------------------------------------------------------------*/
  704. Ende:
  705. address value portname
  706. lister close handle
  707. dopus remtrap '*' 'ceed-handler'
  708. call closeport('ceed-handler')
  709. if show('P','CEED') then do
  710.     address 'CEED'
  711.     if CDDA=1|VIDEO=1 then 'EJECT'
  712.     if CEEDST=1 then 'QUIT'
  713.     end
  714. if show('P','rexx_ScalaMM') then do
  715.     address 'rexx_ScalaMM'
  716.     'QUIT'
  717.     end
  718. exit
  719. /*---Unterprogramm Syntaxfehler------------------------------------------------------------------*/
  720. syntax:
  721. if rc=13 then call Ende /* CeeD wurde über GUI beendet */
  722. say 'Syntax Error' rc',' errortext(rc) 'in line' sigl'.'
  723. return
  724. halt:
  725. address 'rexx_ScalaMM'
  726. 'CONTINUE'
  727. address value portname
  728. lister set handle busy off
  729. lister clear handle progress
  730. lister refresh handle full
  731. call Ende
  732.